18 - Grundlagen der Informatik [ID:1577]
50 von 497 angezeigt

Ja, wir haben uns das letzte Mal, sind wir so weit gekommen, dass wir die Suchbäume eingeführt haben.

Ich will da nochmal das letzte Beispiel, das ich am Ende gebracht habe, nochmal wiederholen.

Das Einfügen in einen Binären Suchbaum, also erinnern wir uns da dran, wir haben einen Baum und an

jeden Knoten ist ein Wert assoziiert und es gibt eine Ordnung auf diesen Werten, zum Beispiel

alphabetische Ordnung oder numerisch oder so. Und wenn ihr also so eine Ordnung habt und ihr sagt,

im linken Unterbaum sind immer Werte kleiner und im rechten Unterbaum immer Werte größer,

die sind geordnet, dann haben wir das letzte Mal gesehen, dann kann die Suche in so einem Baum

sehr viel effizienter geschehen, als wenn wir das in einer verketteten Liste machen und die Zahl

der Such- und Vergleichsschritte steigt mit der Höhe des Suchbaumes und nicht mit der Anzahl

der Elemente. Und vielleicht erinnern Sie sich in der Woche davor, da hatten wir eben auch uns

überlegt, wie viele Knoten in einem Baum der Höhe n sind. Das heißt, so ein Suchbaum ist

natürlich eine enorme Beschleunigung, er möchte eine enorme Beschleunigung. Wir haben geendet mit

dem Einfügen in einen binären Suchbaum und festgestellt, das Einfügen funktioniert nach

dem gleichen Prinzip wie das Suchen. Und wenn die Suche nach dem einzufügenden Element an einem

Knoten erfolglos ist, lässt man in diesem Knoten das neue Element verweisen und wie gesagt,

die Komplexität ist die gleiche wie die Suchoperation. Und jetzt baue ich mir mal so

einen Baum auf. Ich fange also an mit einem Element. Das nächste Element, naja, was passiert,

es ist kleiner, also wird es im linken Unterbaum aufgebaut. Das nächste Element ist kleiner als

der Knoten, die Wurzel, gehe ich links runter. Dann bei der 12 ist es größer, also wird es in

dem rechten Unterbaum von 12 aufgebaut. Und das mache ich jetzt schön weiter und dann habe

ich meinen Suchbaum schrittweise aufgebaut. Okay? Vorgehensweise beim Einfügen, klar? Schauen wir

uns den Code dafür an. Also wir haben eine Methode Einfügen, der geben wir einen Wert mit. In

dem Fall haben wir einen Suchbaum mit numerischen Werten, also ein integer wird übergeben. Wir

initialisieren den Knoten mit der Wurzel. Die Wurzel hat keinen Vaterknoten und wir erzeugen

einen neuen Knoten. Und dieser Knoten hat den Wert, den wir einfügen wollen. So, das passiert

hier oben. Jetzt müssen wir nachschauen, das ist der Sonderfallbehandlung. Ist denn der Baum leer?

Also wenn die Wurzel leer ist, dann wird die Wurzel einfach mit dem neu einzufügenden Wert

besetzt. Ansonsten müssen wir die Position in dem Baum suchen, indem wir den Baum nach unten durchgehen

und wir müssen an der gewünschten Stelle einfügen. Jetzt schauen wir uns die Position suchen an. Wir

wollen also, wir sagen, solange der Knoten nicht auf Null zeigt, jetzt wenn der Knotenwert gleich dem

einzufügenden Wert ist, dann ist er ja schon drin, dann werfen wir eine Exception. Ansonsten, dann

sind sie ungleich, dann sagen wir, der aktuelle Knoten ist jetzt der Vaterknoten und wir schauen

nach, ob der Wert, den wir einfügen wollen, kleiner ist, dann machen wir im linken Teilbaum

weiter und wenn er größer ist, im rechten Teilbaum. Und so lange laufen wir durch, bis wir an die

Stelle kommen. Also solange der Knoten nicht auf Null zeigt, gehen wir den Baum runter, bis wir an

eine Stelle kommen, wo wir einfügen können. Und das einfügen, das passiert jetzt so, dass wir sagen,

wenn der Wert größer der Wert des Vaterknotens ist, dann wird der rechte Unterbaum, also dieser

Knoten hat er jetzt keine Nachfolger mehr, dann wird der rechte Unterbaum auf den neuen Knoten

gesetzt und ansonsten der linke. Ist dieser Ausschnitt aus dem Programm zusammen mit der

Grafik von vorhin klar? Okay. Beim Löschen ist ein bisschen komplizierter, aber auch nicht viel.

Wenn der zu löschende Knoten keinen Nachfolger hat, das ist der Trivialfall, löschen wir ihn

einfach. Wenn der Knoten einen Nachfolger hat, das ist auch noch relativ einfach, dann wird einfach

der Nachfolger an die Stelle gesetzt. Und wenn er zwei Nachfolger hat, dann wird es ein bisschen

komplizierter, aber auch nicht arg, dann wird der zu löschende Knoten durch den am weitesten rechts

liegenden Knoten im linken Teilbaum oder den am weitesten links liegenden Knoten im rechten

Teilbaum ersetzt. Und dieser Knoten muss dann aus dem entsprechenden Teilbaum entfernt werden. Und

das schauen wir uns jetzt gleich mal an, an einem Beispiel. Also wir haben hier einen Baum und bei

dem wollen wir den Knoten 9 löschen. Der Knoten 9, der hat zwei Unterbäume, also müssen wir jetzt

die 9 löschen und durch den am weitesten rechts positionierten Teilbaum im linken Unterbaum ersetzen

oder durch den am weitesten links liegenden Teilbaum im rechten Unterbaum. Warum? Naja, das ist klar.

Teil einer Videoserie :

Zugänglich über

Offener Zugang

Dauer

01:17:55 Min

Aufnahmedatum

2011-07-05

Hochgeladen am

2018-05-07 14:56:06

Sprache

de-DE

Einführung in UNIX/Linux Einführung in die Programmierung mit Java Grundlagen der Rechnerarchitektur Programmiersprachen: von der Maschinensprache zur Objektorientierung Objektorientierte Programmierung Datenstrukturen und Algorithmen: Suchen und Sortieren, Listen, Keller, Bäume Internet, Verteilte Systeme

Einbetten
Wordpress FAU Plugin
iFrame
Teilen